(for Internet Explorer)
6.  条件制御(conditionals)
参考
if [ "$VAR" == "123" ];then
if [ "$VAR" -lt "123" ];then
if [ x"$VAR1" == x"1"  -a  x"$VAR2" == x"1" ];then
AND は -a、OR は -o
man test
で、ヘルプを見ることができます。
等しいとき。 == または =。
数値比較は、-eq, -ge, -gt, -le, -lt, -ne
空白文字は必要です
if [ -e "NoFiFle" ];then
ファイル、または、フォルダーが存在するとき
シンボリック・リンクでは、リンク先が存在しないときは偽
フォルダー、またはフォルダーへのリンクが存在するとき
if [ -d "FolderA" ];then
関連
if false; then
常に偽。 [ ] は付けないこと。
false は終了ステータスが 1 (エラーあり)になる実行ファイルです。
if [ -f "FileA" ];then
ファイル、またはファイルへのリンクが存在するとき
条件文で変数を参照するときは、必ず "" で囲んでください。
囲まないと、変数の値が未定義のときは、比較をする前にエラーになってしまいます。
数値の比較では、数値(リテラル値)を " " で囲む必要はありませんが、囲んでも正しく動きます。
if [ "$VAR" != "123" ];then
等しくないとき
if [ "`A_func "abc"`" ];then
A_func 関数の echo による返り値の判定
if [ -L "FileA" ];then
シンボリックリンクが存在するとき
リンク先が存在しなくても真
上記以外にも、デバイスファイルなど、他の種類もあります。
ファイル、または、フォルダー、または、リンク先が存在しないとき
if [ ! -e "FolderA" ];then
"$VAR1" などの前にある x は、VAR1="(" のときにエラーが出るのを防ぎます。
while [ 条件文 ]; do
  処理
done  #// ; done_func $?
条件文が真(満たしたとき)の間、
処理を繰り返します。
while 文
while true; do
  処理
  if [ 条件文 ];then  break  ;fi
done  #// ; done_func $?
無限ループ
途中で抜ける
#!/bin/bash

function  FuncA()
{
  local  Arg1; Arg1="$1"
  local  var
  echo  "Hello, $arg1"
}

FuncA  "world!"
$1 は、hello 関数の第1引数
FuncA 関数の呼び出し。第1引数は world!
local を付けると、ローカル変数になります。
function  FuncA_func()
{
  local  out_Var; out_Var="$1"
  eval  $out_Var="ret"  #// output argument
}

FuncA_func  variable1  #//[out] variable1
echo  $variable1  #// $variable == "ret"
#!/bin/bash  -e
function  FuncA_func()
{
  return  1  #// exit from here
}

echo  FuncA_func
function  FuncA_func()
{
  local  Number ; Number="$1"
  echo  "$Number"  #// return value
}

Var=`FuncA_func  2`  #// Var = FuncA_func( 2 )
echo  "$Var"        #// echo Var

echo "`FuncA_func  2`"  #// echo  FuncA_func( 2 )
echo による返り値を受け取るときは ` ` または "` `" で関数呼び出しを囲みます。
` ` の中で、" " や ' ' を使うこともできます。

代入するときは ` ` で囲みますが、パラメーターに渡すときは、"` `" で
囲んでください。
同一プロセス内の関数を呼び出す場合
子プロセスを呼び出す場合
result=`./sub.sh --FuncA_func`
function  Args_func()
{
  local  Args; Args=( "$@" )
  local  i

  echo  "length=${#Args[@]}"
  for (( i = 0; i < ${#Args[@]}; i ++ ));do
    echo  "\${Args[$i]}=${Args[$i]}"
  done
}

Args_func  "param1"  "a b"  "c"
length=3
${Args[0]}=param1
${Args[1]}=a b
${Args[2]}=c
表示例
function  Args_func()
{
  echo  "Args_func \$1=\"$1\" \$2=\"$2\""
  echo  "  argument length=$#"

  if [ "$2" == "" ];then
    echo "  \$2 は指定されていないか、空文字列です"
  fi
}

Args_func  "A" "x"
Args_func  "B"
Args_func  "C" ""
表示例
Args_func $1="A" $2="x"
Args_func $1="B" $2=""
  $2 は指定されていないか、空文字列です
Args_func $1="C" $2=""
  $2 は指定されていないか、空文字列です
bash に -e オプションが付いているときは、
0 以外を return すると exit してしまうので
エラーコードとして使ってください。
上記と同じです。 ` ` で囲みます。
関連
関連
参考
引数の数は $#
参考
関数定義は、function から始めます。
注意
` ` を使わない関数呼び出しより 40倍のオーバーヘッドがあります。
を推奨します。
#!/bin/bash  -e
export  g_Ret

function  FuncA_func()
{
  local  Number ; Number="$1"
  g_Ret="$Number"  #// return value
}

FuncA_func  2
echo  "$g_Ret"
上記の最終行のように、引数の中で関数呼び出しをすると、関数内で
発生したエラーを無視してしまうため、推奨しません。
注意
注意
出力引数の名前と、関数の中のローカル変数の名前が衝突すると、
正しく動きません。
を推奨します。
#!/bin/bash  -e
export  g_Ret
export  g_Ret2

function  FuncA_func()
{
  local  Number ; Number="$1"
  g_Ret="$Number"   #// output value 1
  g_Ret2="$Number"  #// output value 2
}

FuncA_func  2
echo  "$g_Ret, $g_Ret2"
プロセスをまたぐリターンをするときは、使えません。
条件文を評価して、真であれば終了コードを0に、偽であれば終了コードを1に設定します。
$ test "1" == "1"
$ echo $?
0
$ test "1" == "2"
$ echo $?
1
if [ "1" == "1" ]; then  echo equal ;fi
if [ ] は、[ というコマンドで、test コマンドと同じです。
if test "1" == "1"; then  echo equal ;fi
if { a="1"; test "$a" == "1"; }; then echo yes; fi
} の前に ; が必要です。
参考
$ export
BASH=/bin/bash
  :
環境変数は、シェルや、シェルから起動するプログラムから参照できるグローバル変数です。
シェル変数は、シェルから起動するプログラムから参照できません。
Linux の変数は大文字と小文字を区別します。
$ export VAR="value"



$ echo "$VAR"
value


$ echo "${VAR}X"
valueX

$ echo -n "$VAR" | hexdump -C
76 61 6c 75 65   |value|

$ unset VAR
… 変数の値を設定する。 export は、子プロセスにも渡す意味。
  変数名と = と値の間にスペースを入れることはできません。
  値を " " で囲まないと、空白文字を含めることができません。

… 変数の値を見る。
  " " で囲まなければ、値に含まれる空白をパラメータの
  区切りとして解釈されます。
… export している変数を一覧する
… 変数の参照の後に英数が続くときは { } で囲む
… 変数を削除するときは unset
→ 環境変数を変更するスクリプト (sed_env.sh)
→ 文字コード番号を調べる
… 変数の内容の詳細を表示する
$ export VAR="value"

$ echo "$VAR"
value

$ echo '$VAR'
$VAR
" " で囲むと、展開され、空白を含んでいても
1つのパラメーターになります

' ' で囲むと、展開されない、空白を含んでいても
1つのパラメーターになります
デフォルトの環境変数は、bash なら $HOME/.bash_profile に記述します。
sh なら $HOME/.profile に記述します。
w_VAR=1
export が無いと、シェル変数(シェルから起動したプログラム
からは見えない)になります。
変数名と = の間にスペースを入れることはできません。
printenv
シェル変数と環境変数を一覧します。
` ` で囲むと、プログラムを実行して標準出力
の内容に置き換わります。
$ echo `echo value`
value
$ export VAR=`echo value`
$ echo $VAR
value
$ `echo export VAR=value`
$ echo $VAR
value
標準出力の内容を、そのまま実行していく
こともできます。
$ export VAR=`expr 1 + 2`
$ echo $VAR
3
$ expr 1 + 2
3
$ expr 1+2
1+2
$ echo $((1+2))
3
計算するときは、expr を実行します
${VAR:-DefaultValue}
$ unset VAR
$ echo  ${VAR:-DefaultValue}
DefaultValue
$ echo  $VAR

$ export VAR=ABC
$ echo  ${VAR:-DefaultValue}
ABC
$ unset VAR
$ echo  ${VAR:=DefaultValue}
DefaultValue
$ echo  $VAR
DefaultValue
${VAR:=DefaultValue}
未定義のときは、DefaultValue を返す
未定義のときは、DefaultValue を返して、代入も行う
サンプル
$ export VAR=A.B.C
$ echo ${VAR%%.*}
A
$ echo ${VAR#*.*}
B.C
$ echo ${VAR%.*}
A.B
$ echo ${VAR##*.}
C
%%Keyword* は、最初(左)にマッチした位置より左
#*Keyword* は、最初(左)にマッチした位置より右
%Keyword* は、最後(右)にマッチした位置より左
##*Keyword は、最後(右)にマッチした位置より右
$ export VAR=A.B.C
$ echo ${VAR/./-}
A-B.C
$ echo ${VAR//./-}
A-B-C
# echo ${VAR/./}
AB.C
/before/after は、最初にマッチした部分だけ置き換えて参照する
//before/after は、マッチしたすべての部分を置き換えて参照する
→ ファイル名の操作 (bash)
関連
起動したシェルスクリプトで設定した環境変数は、スクリプトが終了すると元に戻りますが、
source を付けて起動すると、反映されます。 (子プロセスを起動しないため)
source ./sample.sh
echo  "$HOME/*"  #// NG
ワイルドカードを含むときは、" " や ' ' で囲むと、
展開されません。 ワイルドカードは、ls や copy
などパスを指定するコマンド以外でも使えます。
$ export VAR=UpperLowerLetter
$ echo ${VAR,,}   # to lower case charactor
upperlowerletter
$ echo ${VAR^^}   # to upper case charactor
UPPERLOWERLETTER
すべて小文字に変換する
すべて大文字に変換する
参考
左の場合、キーワードは、ピリオド1文字です。
expr は、数字と演算子の間に空白文字が必要です。
$(( )) : $と二重括弧でも計算できます。
空白文字は不要です。
マッチしなければ、全体が返ります。
VAR="abcab"
VAR2=`echo "$VAR" | sed -e "s/^ab/xy/"`
先頭の ab を xy に置き換える
下記の機能もありますが、検索キーワード(sed など)が無いため非推奨です。
参考
source が必要シェルスクリプトは、環境変数 SHLVL が 1 でなければ警告するとよいでしょう。
$ VAR="ABCDE"
$ echo ${VAR:2:2}
CD
zsh の場合、$VAR[2,3] = "BC"  #// x 文字目から y 文字目まで
${VAR:x:y} は、x+1 文字目から y 文字
$ var='A1\nB1\tC1'
$ hexdump -C <<< $var
00000000  41 31 5c 6e 42 31 5c 74  43 31 0a   |A1\nB1\tC1.|

$ echo -e -n $var | hexdump -C
00000000  41 31 0a 42 31 09 43 31    |A1.B1.C1|
echo に -e オプションを付けると、"\t" や "\n" を、タブ文字や改行文字に置き換えて
出力します。 \t や \n は変数ではないので、"  " で囲んだときも、' ' で囲んだときも
同じ結果になります。
echo に -n を付けると、最後に改行文字を出力しなくなります。
$ echo "\" \\ \n"
" \ \n

$ echo '\" \\ \n'"'"
\" \\ \n'
" " で囲むと、\" は " に、\\ は \ に変換されます。
それ以外は、変換されず、\ も残ったままになります。

' ' で囲むと、\ があっても、変換しません。
' を文字にするときは、" " で囲んでください。
expr は、計算結果が 0 になると終了ステータスが 1 になるため、非推奨。
$(( )) は、計算結果が 0 になっても、終了ステータスは 0 です。
" " の中は、' がそのまま使えます。 ' ' の中は、" がそのまま使えます。
" " と ' ' の間に空白を入れずに隣り合わせると、1つの文字列になります。
参考
USER
アカウント名
HOME
ホーム・ディレクトリ
グループは groups コマンドを使う
#!/bin/bash

# full_path
full_path="/path/to/foo.tar.gz"
echo "full_path: $full_path"

# folder
full_path="/path/to/foo.tar.gz"
folder=${full_path%/*}  #// parent folder
echo "folder: $folder"

# file_name
full_path="/path/to/foo.tar.gz"
file_name=${full_path##*/}
echo "file_name: $file_name"

# base_name
full_path="/path/to/foo.tar.gz"
file_name=${full_path##*/}
base_name=${file_name%.*}
echo "base_name: $base_name"

# extension
full_path="/path/to/foo.tar.gz"
extension=${full_path##*.}
echo "extension: $extension"

# absolute_path, canonicalized_path
step_path="../foo.tar.gz"
full_path=`readlink -f $step_path`
echo "full_path: $full_path"

# step_path
full_path="/path/to/foo.tar.gz"
base_path="/path"
step_path=`echo "$full_path" | \
  sed -e "s%^$base_path/%%"`
foo.tar.gz
foo.tar
gz
/path/to/foo.tar.gz
/path/to
親フォルダー
ファイル名(拡張子あり)
ファイル名(拡張子なし)
/path/foo.tar.gz
元のパス
to/foo.tar.gz
folders=(`ls -p "FolderA" | grep / | sed -e "s%/$%%g"`)  #// enum folder names
FolderA フォルダーの直下にあるフォルダーの名前を配列に入れます。
格納する内容は、フルパスではありません。
FolderA
files=(`find "sub" -type f -name "*.h" -print | sed -e "s%sub/%%g"`)
sub フォルダーの中から、h という拡張子を持つファイルの相対パスを配列に
入れます。
sub
sub
*.h
ファイルかフォルダーが無いと使えない
シンボリックリンクのリンク先になります。
参考
echo  $LINENO
echo  $FUNCNAME
カレント・フォルダー(ピリオド)を指定するときは、sed のパラメーターに
指定するピリオドの前に \ を記述してエスケープする必要があります。
files=(`find "." -type f -name "*.h" -print | sed -e "s%\./%%g"`)
paths=(`ls -a1 "$extract_folder"`)  #// enum folder or file names
ファイル、または、フォルダーの一覧を配列に入れる
$ dirname /folder/sub/file.txt
/folder/sub
指定したパスから、ファイル名を除いたものを表示します。
サンプル
サンプル
$ var=`dirname /folder/sub/file.txt`
$ echo "$var"
/folder/sub
sub/file.txt
引数
表示内容(返り値)
sub
/file.txt
/
file.txt
.
.
.
/
/
../file.txt
..
..
.
$ basename /folder/sub/file.txt
file.txt
指定したパスから、ファイル名を表示します。
サンプル
サンプル
$ var=`basename /folder/sub/file.txt`
$ echo "$var"
file.txt